ROIPooling ================= 对输入特征图按指定 ROI (Region of Interest) 进行池化操作,将每个 ROI 区域划分为固定大小的池化单元,并取每个通道的最大值输出。 .. math:: \text{pooled\_height} = \left\lceil \frac{\text{roi\_end\_h} - \text{roi\_start\_h} + 1}{\text{pooled\_height}} \right\rceil \text{pooled\_width} = \left\lceil \frac{\text{roi\_end\_w} - \text{roi\_start\_w} + 1}{\text{pooled\_width}} \right\rceil \text{pooled\_output}[i,j,c] = \max_{h,w \in \text{bin}(i,j)} \text{input}[\text{roi\_start\_h}+h, \text{roi\_start\_w}+w, c] 其中: - \( \text{bin}(i,j) \) 表示第 \(i\) 行、第 \(j\) 列池化单元对应的输入特征图区域。 - \(c\) 表示通道索引。 输入: - **in_ptr** - 输入特征图地址。 - **input_n** - 输入批大小。 - **input_h** - 输入高度。 - **input_w** - 输入宽度。 - **input_c** - 输入通道数。 - **num_rois** - ROI 数量。 - **scale** - ROI 缩放因子。 - **pooled_height** - 池化输出高度。 - **pooled_width** - 池化输出宽度。 - **roi** - ROI 坐标数组,格式为 [batch_index, x1, y1, x2, y2]。 - **core_mask** - 核掩码(仅适用于共享存储版本)。 输出: - **out_ptr** - 池化输出地址。 - **max_c** - 每通道最大值缓冲区,用于计算池化结果。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持fp, int8 - MT7004 支持hp, fp **共享存储版本:** .. c:function:: void fp_roipooling_s(int input_n,int input_h,int input_w,int input_c,int num_rois,float scale,int pooled_height,int pooled_width,const float *in_ptr,float *out_ptr,const float *roi,float *max_c,int core_mask) .. c:function:: void hp_roipooling_s(int input_n,int input_h,int input_w,int input_c,int num_rois,float scale,int pooled_height,int pooled_width,const half *in_ptr,half *out_ptr,const half *roi,half *max_c,int core_mask) .. c:function:: void i8_roipooling_s(int input_n,int input_h,int input_w,int input_c,int num_rois,float scale,int pooled_height,int pooled_width,const int8_t *in_ptr,int8_t *out_ptr,const float *roi,int8_t *max_c,int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 12 #include #include int main() { float *input = (float *)0xA0000000; // 输入在DDR空间 float *output = (float *)0xC0000000; float max_c[64]; // 通道数假设为64 float roi[10*5]; // 10个ROI示例 int num_rois = 10; int core_mask = 0xff; fp_roipooling_s(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c, core_mask); return 0; } **私有存储版本:** .. c:function:: void fp_roipooling_p(int input_n,int input_h,int input_w,int input_c,int num_rois,float scale,int pooled_height,int pooled_width,const float *in_ptr,float *out_ptr,const float *roi,float *max_c) .. c:function:: void hp_roipooling_p(int input_n,int input_h,int input_w,int input_c,int num_rois,float scale,int pooled_height,int pooled_width,const half *in_ptr,half *out_ptr,const half *roi,half *max_c) .. c:function:: void i8_roipooling_p(int input_n,int input_h,int input_w,int input_c,int num_rois,float scale,int pooled_height,int pooled_width,const int8_t *in_ptr,int8_t *out_ptr,const float *roi,int8_t *max_c) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 11 #include #include int main() { float *input = (float *)0x10810000; // 输入在L2空间 float *output = (float *)0x10820000; float max_c[64]; float roi[10*5]; int num_rois = 10; fp_roipooling_p(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c); return 0; }